#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<algorithm>
#include<iostream>
#include<string>
#include<cmath>
#include<queue>
#include<vector>
#include<map>
using namespace std;
const double EPS=1e-9;
#define MAXN 1210
#define MAXE (3000000)
struct Point
{
    double x,y;
    Point(){};
}P[MAXN];
double Rel(Point a,Point b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
struct edge
{
    int v,next;
};
struct Sat2
{
    int Nsum,Esum;
    int st[MAXN<<1];
    edge e[MAXE];
    queue<int> q;
    bool used[MAXN],select[MAXN<<1];
    bool flag;
    void init(int n);
    void addEdge(int a,int b);
    void _addEdge(int a,int b);
    void dfs(int cur);
    bool solve();
}ans;
void Sat2::init(int n)
{
    memset(st,-1,sizeof(st));
    memset(used,0,sizeof(used));
    memset(select,0,sizeof(select));
    while (!q.empty()) q.pop();
    Nsum=n;
    Esum=0;
}
void Sat2::_addEdge(int a,int b)
{
    //cout<<a<<"->"<<b<<endl;
    e[Esum].v=b;
    e[Esum].next=st[a];
    st[a]=Esum++;
}
void Sat2::addEdge(int a,int b)
{
    _addEdge(a,b);
    _addEdge(b,a);
}

void Sat2::dfs(int cur)
{
    if (!flag) return ;
    q.push(cur>>1);
    used[cur>>1]=1;
    select[cur]=1;
    select[cur^1]=0;
    for (int t=st[cur];t+1;t=e[t].next)
    {
        if (!used[e[t].v>>1])
            dfs(e[t].v^1);
        else if (!select[e[t].v^1])
        {
            flag=0;
            used[e[t].v>>1]=0;
            return;
        }
    }
}
bool Sat2::solve()
{
    for (int i=0;i<Nsum;++i)
        if (!used[i])
        {
            flag=1;
            dfs(i<<1);
            if (!flag)
            {
                while (!q.empty())
                {
                    used[q.front()]=0;
                    q.pop();
                }
                flag=1;
                dfs(i<<1|1);
                if (!flag) return 0;
            }
        }
    return 1;
}
double x,y,mid;
int main()
{
    int i,N,j;
    while (~scanf("%d",&N))
    {
        for (i=0;i<N;i++)
            scanf("%lf%lf",&P[i].x,&P[i].y);
        x=0;y=1e5;
        while (y-x>EPS)
        {
            mid=(y+x)/2.0;
            ans.init(N);
            for(i=0;i<N;i++)
                ans.addEdge(i<<1,i<<1|1);
            for(i=0;i<N;i++)
            {
                for(j=i+1;j<N;j++)
                    if(Rel(P[i],P[j])<=mid)
                    {
                        ans.addEdge(i<<1,j<<1);
                        ans.addEdge(i<<1|1,j<<1|1);
                    }
            }
            if(ans.solve())
            {
                x=mid;
            }
            else
            {
                y=mid;
            }
        }
        printf("%.7lf\n",x/2.0);
        //cout<<"D\n";
        ans.init(N);
        for(i=0;i<N;i++)
            ans.addEdge(i<<1,i<<1|1);
        for(i=0;i<N;i++)
            for(j=i+1;j<N;j++){
                //cout<<i<<' '<<j<<' '<<Rel(P[i],P[j])<<endl;
                if(Rel(P[i],P[j])<=x)
                {
                    ans.addEdge(i<<1,j<<1);
                    ans.addEdge(i<<1|1,j<<1|1);
                }
            }
        ans.solve();
        if(!ans.select[1])
            cout<<1;
        else cout<<2;
        for(i=1;i<N;i++)
            if(!ans.select[i<<1|1])
                cout<<' '<<1;
            else cout<<' '<<2;
        cout<<endl;
    }
}
